# 一共有7个代码文件，每个文件对应一个最能体现的原则，请找出每个原则对应的代码文件，然后分析该代码文件是如何体现该原则的。

# 请将文件名修改为相应的原则名称，如：1.单一职责原则.py。并回答以下问题。然后将代码文件上传到之前实验创建的码云仓库中。
# 将码云代码仓库里新建文件夹code_snippets，将代码文件放入该文件夹中。

# 1. 运行代码
# 输出如下：
# 图书《Python 编程》已借出。
# 发送通知给用户 1：你已成功借阅图书 B1001
# 用户 Bob 没有权限借书。
# 图书《Python 编程》已归还。
# 发送通知给用户 1：你已成功归还图书 B1001

# 2. 指出该代码体现了哪个原则
# 体现了迪米特法则（Law of Demeter, LoD）

# 3. 请说明该代码是如何体现该原则
# 迪米特法则指出，一个对象应该尽可能少地与其他对象发生交互，以减少耦合度，提高模块的独立性。
# 在这个例子中：
# - `LibraryManagementSystem` 类通过组合的方式管理 `InventorySystem`、`PermissionSystem` 和 `NotificationSystem`，而不是直接调用这些系统的内部方法。
# - `LibraryManagementSystem` 只与它直接管理的对象进行交互，而不直接访问这些对象的内部细节。
# - 这种设计使得 `LibraryManagementSystem` 的内部实现更加简洁，减少了对象之间的耦合，提高了系统的可维护性和扩展性。


# 图书类，负责图书相关信息
class Book:
    def __init__(self, book_id, title):
        self.book_id = book_id
        self.title = title
        self.is_available = True

    def borrow(self):
        self.is_available = False
        print(f"图书《{self.title}》已借出。")

    def return_book(self):
        self.is_available = True
        print(f"图书《{self.title}》已归还。")

# 库存系统，负责图书的存储与借阅操作
class InventorySystem:
    def __init__(self):
        self.books = {}

    def add_book(self, book: Book):
        self.books[book.book_id] = book

    def borrow_book(self, book_id):
        if book_id in self.books and self.books[book_id].is_available:
            self.books[book_id].borrow()
        else:
            print(f"图书 {book_id} 不可借阅或不存在。")

    def return_book(self, book_id):
        if book_id in self.books:
            self.books[book_id].return_book()
        else:
            print(f"图书 {book_id} 不存在。")

# 权限系统，负责检查用户是否有权限借书
class PermissionSystem:
    def check_permission(self, user):
        return user.has_permission()

# 通知系统，负责向用户发送通知
class NotificationSystem:
    def send_notification(self, user_id, message):
        print(f"发送通知给用户 {user_id}：{message}")

# 用户类，包含用户的权限信息
class User:
    def __init__(self, user_id, name, permission_level):
        self.user_id = user_id
        self.name = name
        self.permission_level = permission_level

    def has_permission(self):
        return self.permission_level >= 1

# 图书管理系统，使用组合/聚合方式实现对库存、权限和通知系统的管理
class LibraryManagementSystem:
    def __init__(self, inventory: InventorySystem, permission_system: PermissionSystem, notification_system: NotificationSystem):
        self.inventory = inventory
        self.permission_system = permission_system
        self.notification_system = notification_system

    def borrow_book(self, user: User, book_id):
        if self.permission_system.check_permission(user):
            self.inventory.borrow_book(book_id)
            self.notification_system.send_notification(user.user_id, f"你已成功借阅图书 {book_id}")
        else:
            print(f"用户 {user.name} 没有权限借书。")

    def return_book(self, user: User, book_id):
        self.inventory.return_book(book_id)
        self.notification_system.send_notification(user.user_id, f"你已成功归还图书 {book_id}")

# 测试示例
if __name__ == "__main__":
    # 初始化系统组件
    inventory_system = InventorySystem()
    permission_system = PermissionSystem()
    notification_system = NotificationSystem()

    # 添加图书
    book1 = Book("B1001", "Python 编程")
    book2 = Book("B1002", "数据科学")
    inventory_system.add_book(book1)
    inventory_system.add_book(book2)

    # 初始化图书管理系统
    library_system = LibraryManagementSystem(inventory_system, permission_system, notification_system)

    # 创建用户
    user1 = User(user_id=1, name="Alice", permission_level=1)
    user2 = User(user_id=2, name="Bob", permission_level=0)

    # 用户借书
    library_system.borrow_book(user1, "B1001")
    library_system.borrow_book(user2, "B1002")

    # 用户还书
    library_system.return_book(user1, "B1001")
